7449. Вектор. Скалярное произведение

 

Даны два вектора. Найдите их скалярное произведение и угол между ними.

 

Напишите код согласно следующего интерфейса:

 

class Vector // C++

{

public:

  int dx, dy;

  Vector(void);     // Конструктор. Прочитайте координаты вектора

  double Len(void); // Возвращает длину вектора

  int operator *(Vector &b); // Перегрузка оператора *:                          

                         // возвращает скалярное произведение векторов

  double GetAngle(Vector &b); // Возвращает в радианах угол между

                              // текущим вектором и вектором b

};

 

class Vector // Java

{

  private int dx, dy;

  Vector(); // Конструктор. Создает нулевой вектор

  Vector(int dx, int dy); // Конструктор. Создает вектор (dx, dy)

  public double getLength(); // Возвращает длину вектора

  public int Scalar(Vector v); // Скалярное произведение векторов

  public double GetAngle(Vector v); // Угол между векторами

};

 

Вход. Четыре целых числа – координаты ненулевых векторов. Все числа по модулю не превосходят 10000.

 

Выход. В первой строке выведите скалярное произведение двух векторов, а во второй выведите величину неориентированного угла между векторами с точностью до пяти десятичных знаков. Выводимое число должно принадлежать интервалу [0; π].

 

Пример входа

Пример выхода

2 1 3 5

11

0.56673

 

 

РЕШЕНИЕ

ООП – перегрузка операторов

 

Анализ алгоритма

Объявим класс Vector и реализуем требуемые методы.

 

Реализация алгоритма

 

#include <stdio.h>

#include <math.h>

 

class Vector

{

public:

  int dx, dy;

 

  Vector(void)

  {

    scanf("%d %d",&dx,&dy);

  }

 

  double Len(void)

  {

    return sqrt(1.0*dx*dx + dy*dy);

  }

 

  int operator *(Vector &b)

  {

    return dx * b.dx + dy * b.dy;

  }

 

  double GetAngle(Vector &b)

  {

    return acos((double)(*this * b) / this->Len() / b.Len());

  }

};

 

int main(void)

{

  Vector a, b;

  printf("%d\n",a * b); 

  printf("%.5lf\n",a.GetAngle(b)); 

  return 0;

}

 

Реализация алгоритма – описание интерфейса + отдельная реализация методов

 

#include <stdio.h>

#include <math.h>

 

class Vector {

public:

  int dx;

  int dy;

  Vector();

  double Len();

  int operator*(Vector &b);

  double GetAngle(Vector &b);

};

 

Vector::Vector() {

  scanf("%d %d",&dx,&dy);

}

 

double Vector::Len() {

  return sqrt(1.0*dx*dx + dy*dy);

}

 

int Vector::operator*(Vector &b) {

  return dx * b.dx + dy * b.dy;

}

 

double Vector::GetAngle(Vector &b) {

  return acos((double)(*this * b) / this->Len() / b.Len());

}

 

int main(void)

{

  Vector a, b;

  printf("%d\n",a * b); 

  printf("%.5lf\n",a.GetAngle(b)); 

  return 0;

}

 

Java реализация

 

import java.util.*;

 

class Vector

{

  private int dx, dy;

 

  Vector()

  {

    dx = dy = 0;

  }

 

  Vector(int dx, int dy)

  {

    this.dx = dx;

    this.dy = dy;

  }

 

  public double getLength()

  {

    return Math.sqrt(dx * dx + dy * dy);

  }

 

  public int Scalar(Vector v)

  {

    return v.dx * dx + v.dy * dy;

  }

 

  public double GetAngle(Vector v)

  {

    int s = this.Scalar(v);

    return Math.acos(s / this.getLength() / v.getLength());

  }

};

 

public class Main

{

  public static void main(String[] args)

  {

    Scanner con = new Scanner(System.in);

    int a = con.nextInt();

    int b = con.nextInt();

    Vector u = new Vector(a,b);

   

    a = con.nextInt();

    b = con.nextInt();

    Vector v = new Vector(a,b);

   

    System.out.println(u.Scalar(v));

    System.out.println(u.GetAngle(v));

    con.close();

  }

}